using Blog2025.Domain.Entities;
using Blog2025.Domain.Repositories;
using Blog2025.Infrastructure.Data;
using Microsoft.EntityFrameworkCore;
namespace Blog2025.Infrastructure.Repositories;
public class EfRepository<T> : IRepository<T> where T: EntityBase

{
    // 需要数据库上下文
    private readonly Blog2025DbContext _db;
    private readonly DbSet<T> _tb;
    public EfRepository(Blog2025DbContext db)
    {
        _db = db;
        _tb = _db.Set<T>();
    }
    public IQueryable<T> Table { get { return _tb.AsNoTracking().Where(x=>x.IsDeleted==false); } }
    public async Task<T> CreateAsync(T entity)
    {
        var obj = await _tb.AddAsync(entity);
        await _db.SaveChangesAsync();
        return obj.Entity;
    }

    public async Task DeleteAsync(T entity)
    {
        // _tb.Remove(entity);
        entity.IsDeleted = true;
        await UpdateAsync(entity);
    }

    public async Task<IEnumerable<T>> GetAllAsync()
    {
        var list = await _tb.AsNoTracking().ToListAsync();
        return list;
    }

    public async Task<T?> GetByIdAsync(Guid id)
    {
        var obj = await _tb.FindAsync(id);

        return obj;
    }
    
    public async Task UpdateAsync(T entity)
    {
        entity.UpdatedAt = DateTime.UtcNow;
        _tb.Update(entity);
        await _db.SaveChangesAsync();
    }
    public async Task<IQueryable<T>> GetPagedAsync(int pageIndex, int pageSize)
    {
        var list =await _tb.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync();
        return list.AsQueryable();
    }

}